﻿// 099. 激光炸弹.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

/*
https://www.acwing.com/problem/content/101/
地图上有 N 个目标，用整数 Xi,Yi 表示目标在地图上的位置，每个目标都有一个价值 Wi。

注意：不同目标可能在同一位置。

现在有一种新型的激光炸弹，可以摧毁一个包含 R×R 个位置的正方形内的所有目标。

激光炸弹的投放是通过卫星定位的，但其有一个缺点，就是其爆炸范围，即那个正方形的边必须和 x，y 轴平行。

求一颗炸弹最多能炸掉地图上总价值为多少的目标。

输入格式
第一行输入正整数 N 和 R，分别代表地图上的目标数目和正方形的边长，数据用空格隔开。

接下来 N 行，每行输入一组数据，每组数据包括三个整数 Xi,Yi,Wi，分别代表目标的 x 坐标，y 坐标和价值，数据用空格隔开。

输出格式
输出一个正整数，代表一颗炸弹最多能炸掉地图上目标的总价值数目。

数据范围
0≤R≤109
0<N≤10000,
0≤Xi,Yi≤5000
0≤Wi≤1000
输入样例：
2 1
0 0 1
1 1 1
输出样例：
1


5 2
0 0 1
0 2 1
1 1 2
2 0 1
2 2 3

*/

const int N = 5010;
int mm[N][N];
int n, r, len;

void solve() {
	for (int i = 0; i < len; i++) {
		for (int j = 0; j < len; j++) {
			int sum = mm[i][j];
			if (i > 0) { sum += mm[i - 1][j]; }
			if (j > 0) { sum += mm[i][j - 1]; }
			if (i > 0 && j > 0) { sum -= mm[i - 1][j - 1]; }
			mm[i][j] = sum;
		}
	}

	int ans = 0;
	for (int i = r - 1; i < len; i++) {
		for (int j = r - 1; j < len; j++) {
			int sum = mm[i][j];
			if (i >= r) { sum -= mm[i - r][j]; }
			if (j >= r) { sum -= mm[i][j - r]; }
			if (i >= r && j >= r) { sum += mm[i - r][j - r]; }
			ans = max(ans, sum);
		}
	}
	cout << ans << endl;
	return;
}

int main()
{
	cin >> n >> r;   int maxx = 0; int maxy = 0;
	for (int i = 0; i < n; i++) {
		int x, y, w;
		cin >> x >> y >> w;  mm[x][y] += w;
		maxx = max(x, maxx); maxy = max(y, maxy);
	}
	len = max(maxx, maxy) + 1;
	//	cout << len << " "<<maxx<<" "<<maxy<<endl;  return 0;
	r = min(len, r);
	solve();

	return 0;
}
